package com.atguigu.utils;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 日志类：作为的横切逻辑出现（横向抽取）
 * 动态代理技术，将横切逻辑功能，植入到真正的业务逻辑中
 * Spring的AOP技术完成（底层也是动态代理）
 *
 * 方法的四个方位信息（连接点）
 * 不会同时执行四个
 */
public class LogUtils {
    /**
     * 植入的方位信息（方位信息）
     * 方法开始执行前
     */
    public void printBeforeMethod(){
        System.out.println("方法开始执行前【日志】");
    }
    /**
     * 植入的方位信息（方位信息）
     * 方法正常执行返回
     */
    public void printAfterReturn(){
        System.out.println("方法正常执行返回【日志】");
    }

    /**
     * 植入的方位信息（方位信息）
     * 方法异常时
     */
    public void printAfterThrowing(){
        System.out.println("方法异常时【日志】");
    }

    /**
     * 植入的方位信息（方位信息）
     * 方法开始执行后，相当于是finally
     */
    public void printAfterMethod(){
        System.out.println("方法开始执行后【日志】");
    }


    /**
     *
     * 环绕通知：
     *   要切入的逻辑方法（方位信息4个）
     *   一个环绕通知，替代掉4个方位信息
     *
     *  接口；ProceedingJoinPoint 正在执行的过程的加入点
     *  接口代表我们的业务逻辑方法
     *
     *  joinPoint.proceed(); 代表我们的业务层的方法 insertAccount (本案例)
     */
    public Object round(ProceedingJoinPoint joinPoint){
        Object result = null;
        try {
            System.out.println("方法开始执行前【日志】- 环绕通知");
            result = joinPoint.proceed();//代表我们的业务层的方法 insertAccount (本案例)
            System.out.println("方法正常执行返回【日志】- 环绕通知");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("方法异常时执行【日志】- 环绕通知");
        }
        System.out.println("方法开始执行后【日志】- 环绕通知");
        return result;
    }
}
